//https://codeforces.com/problemset/problem/1734/D
//题意：给你一组数，以及一个初始位置，你可以从初始位置任意向两边移动，每移动到一个新位置要加上当前位置的数字，当前位置数字置0，如果移动过程中你的数字小于零则失败，如果到达左右两端则成功
//贪心模拟
//o(n)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[2000005];
ll ge[2000005],co[2000005];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
            ge[i]=0;
            co[i]=0;
        }
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        queue<int> pathl,pathr;
        bool book=1;
        for(int i=k-1;i>0;i--){
            if(book){
                ge[i]=ge[i+1]+a[i];
                co[i]=min(co[i+1],ge[i]);
            }
            else{
                ge[i]=a[i];
                co[i]=a[i];
            }
            book=1;
            if(ge[i]>0||i==1){
                pathl.push(i);
                book=0;
            }
            
        }
        book=1;
        for(int i=k+1;i<=n;i++){
            if(book){
                ge[i]=ge[i-1]+a[i];
                co[i]=min(co[i-1],ge[i]);
            }
            else{
                ge[i]=a[i];
                co[i]=a[i];                
            }
            book=1;
            if(ge[i]>0||i==n){
                pathr.push(i);
                book=0;
            }
        }
        int now=k,flag=0;
        a[0]=a[k];
        while(1){
            bool l=1,r=1;
            if(pathl.empty()||pathr.empty()){
                flag=1;
                break;
            }            
            if(a[0]+co[pathl.front()]>=0){
                a[0]+=ge[pathl.front()];
                pathl.pop();
                l=0;
            }
            if(a[0]+co[pathr.front()]>=0){
                a[0]+=ge[pathr.front()];
                pathr.pop();
                r=0;
            }

            if(l&&r){
                break;
            }
        }
        if(flag)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}